package com.zxy.leetcode._00200_00299._00220_00229;

/**
 * https://leetcode-cn.com/problems/rectangle-area/
 *
 * 223. 矩形面积
 * 给你 二维 平面上两个 由直线构成的 矩形，请你计算并返回两个矩形覆盖的总面积。
 * 每个矩形由其 左下 顶点和 右上 顶点坐标表示：
 * 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
 * 第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。
 *
 */
public class Test00223 {

    public static void main(String[] args) {
        Test00223 test = new Test00223();
        System.out.println();

        int a1 = test.computeArea(-3, 0, 3, 4, 0, -1, 9, 2);
        System.out.println(a1);
        System.out.println(a1 == 45);

        int a2 = test.computeArea(-2, -2, 2, 2, -2, -2, 2, 2);
        System.out.println(a2);
        System.out.println(a2 == 16);
    }

    public int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) {
        int x = cross(ax1, ax2, bx1, bx2);
        int y = cross(ay1, ay2, by1, by2);

        // 覆盖部分的面积
        int crossArea = (x <=0 || y <= 0) ? 0 : x*y;

        return (ax2 - ax1) * (ay2 - ay1) + (bx2 - bx1) * (by2 - by1) - crossArea;
    }

    private int cross(int a1, int a2, int b1, int b2) {
        // a 在 b 里面
        if (a1 >= b1 && a2 <= b2) {
            return a2 - a1;
        }

        // b 在 a 里面
        if (b1 >= a1 && b2 <= a2) {
            return b2 - b1;
        }

        // a 在 b 左边
        if (a1 < b1) {
            return a2 - b1;
        }

        // a 在 b 右边
        if (a1 > b1) {
            return b2 - a1;
        }

        return 0;
    }

}
